package classic

/**
 * 给你一个整数数组 nums，返回 数组 answer ，其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
 *
 * 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在  32 位 整数范围内。
 *
 * 请不要使用除法，且在 O(n) 时间复杂度内完成此题。
 *
 *
 *
 * 示例 1:
 *
 * 输入: nums = [1,2,3,4]
 * 输出: [24,12,8,6]
 *
 * 示例 2:
 *
 * 输入: nums = [-1,1,0,-3,3]
 * 输出: [0,0,9,0,0]
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/product-of-array-except-self
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
fun productExceptSelf(nums: IntArray): IntArray {
    val len = nums.size
    val leftNums = IntArray(nums.size)
    leftNums[0] = 1
    var temp = 1
    for (index in 1 until len) {
        temp *= nums[index - 1]
        leftNums[index] = temp
    }
    val rightNums = IntArray(len)
    rightNums[len - 1] = 1
    temp = 1
    for (index in len - 2 downTo 0) {
        temp *= nums[index + 1]
        rightNums[index] = temp
    }
    for (index in nums.indices) {
        nums[index] = leftNums[index] * rightNums[index]
    }
    return nums
}

fun productExceptSelf2(nums: IntArray): IntArray {
    val len = nums.size
    val answer = IntArray(len)
    var temp = 1
    answer[0] = 1
    for (index in 1 until len) {
        temp *= nums[index - 1]
        answer[index] = temp
    }
    temp = 1
    for (index in len - 2 downTo 0) {
        temp *= nums[index + 1]
        answer[index] = temp * answer[index]
    }
    return answer
}

fun main() {
//    println(productExceptSelf(intArrayOf(1, 2, 3, 4)).contentToString())
    println(productExceptSelf2(intArrayOf(-1, 1, 0, -3, 3)).contentToString())
}
